home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / doom / turric03.zip / TURRIC03.ZIP / PROGS / BOSS.QC < prev    next >
Text File  |  1996-07-25  |  13KB  |  386 lines

  1. /*
  2. ==============================================================================
  3.  
  4. BOSS-ONE
  5.  
  6. ==============================================================================
  7. */
  8. $cd /raid/quake/id1/models/boss1
  9. $origin 0 0 -15
  10. $base base
  11. $skin skin
  12. $scale 5
  13.  
  14. $frame rise1 rise2 rise3 rise4 rise5 rise6 rise7 rise8 rise9 rise10
  15. $frame rise11 rise12 rise13 rise14 rise15 rise16 rise17 
  16.  
  17. $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8
  18. $frame walk9 walk10 walk11 walk12 walk13 walk14 walk15
  19. $frame walk16 walk17 walk18 walk19 walk20 walk21 walk22
  20. $frame walk23 walk24 walk25 walk26 walk27 walk28 walk29 walk30 walk31
  21.  
  22. $frame death1 death2 death3 death4 death5 death6 death7 death8 death9
  23.  
  24. $frame attack1 attack2 attack3 attack4 attack5 attack6 attack7 attack8
  25. $frame attack9 attack10 attack11 attack12 attack13 attack14 attack15
  26. $frame attack16 attack17 attack18 attack19 attack20 attack21 attack22
  27. $frame attack23
  28.  
  29. $frame shocka1 shocka2 shocka3 shocka4 shocka5 shocka6 shocka7 shocka8
  30. $frame shocka9 shocka10 
  31.  
  32. $frame shockb1 shockb2 shockb3 shockb4 shockb5 shockb6
  33.  
  34. $frame shockc1 shockc2 shockc3 shockc4 shockc5 shockc6 shockc7 shockc8 
  35. $frame shockc9 shockc10
  36.  
  37.  
  38. void(vector p) boss_missile;
  39.  
  40. void() boss_face =
  41. {
  42.     
  43. // go for another player if multi player
  44.     if (self.enemy.health <= 0 || random() < 0.02)
  45.     {
  46.         self.enemy = find(self.enemy, classname, "player");
  47.         if (!self.enemy)
  48.             self.enemy = find(self.enemy, classname, "player");
  49.     }
  50.     ai_face();
  51. };
  52.  
  53. void() boss_rise1    =[    $rise1, boss_rise2 ] {
  54. sound (self, CHAN_WEAPON, "boss1/out1.wav", 1, ATTN_NORM);
  55. };
  56. void() boss_rise2    =[    $rise2, boss_rise3 ] {
  57. sound (self, CHAN_VOICE, "boss1/sight1.wav", 1, ATTN_NORM);
  58. };
  59. void() boss_rise3    =[    $rise3, boss_rise4 ] {};
  60. void() boss_rise4    =[    $rise4, boss_rise5 ] {};
  61. void() boss_rise5    =[    $rise5, boss_rise6 ] {};
  62. void() boss_rise6    =[    $rise6, boss_rise7 ] {};
  63. void() boss_rise7    =[    $rise7, boss_rise8 ] {};
  64. void() boss_rise8    =[    $rise8, boss_rise9 ] {};
  65. void() boss_rise9    =[    $rise9, boss_rise10 ] {};
  66. void() boss_rise10    =[    $rise10, boss_rise11 ] {};
  67. void() boss_rise11    =[    $rise11, boss_rise12 ] {};
  68. void() boss_rise12    =[    $rise12, boss_rise13 ] {};
  69. void() boss_rise13    =[    $rise13, boss_rise14 ] {};
  70. void() boss_rise14    =[    $rise14, boss_rise15 ] {};
  71. void() boss_rise15    =[    $rise15, boss_rise16 ] {};
  72. void() boss_rise16    =[    $rise16, boss_rise17 ] {};
  73. void() boss_rise17    =[    $rise17, boss_missile1 ] {};
  74.  
  75. void() boss_idle1    =[    $walk1, boss_idle2 ]
  76. {
  77. // look for other players
  78. };
  79. void() boss_idle2    =[    $walk2, boss_idle3 ] {boss_face();};
  80. void() boss_idle3    =[    $walk3, boss_idle4 ] {boss_face();};
  81. void() boss_idle4    =[    $walk4, boss_idle5 ] {boss_face();};
  82. void() boss_idle5    =[    $walk5, boss_idle6 ] {boss_face();};
  83. void() boss_idle6    =[    $walk6, boss_idle7 ] {boss_face();};
  84. void() boss_idle7    =[    $walk7, boss_idle8 ] {boss_face();};
  85. void() boss_idle8    =[    $walk8, boss_idle9 ] {boss_face();};
  86. void() boss_idle9    =[    $walk9, boss_idle10 ] {boss_face();};
  87. void() boss_idle10    =[    $walk10, boss_idle11 ] {boss_face();};
  88. void() boss_idle11    =[    $walk11, boss_idle12 ] {boss_face();};
  89. void() boss_idle12    =[    $walk12, boss_idle13 ] {boss_face();};
  90. void() boss_idle13    =[    $walk13, boss_idle14 ] {boss_face();};
  91. void() boss_idle14    =[    $walk14, boss_idle15 ] {boss_face();};
  92. void() boss_idle15    =[    $walk15, boss_idle16 ] {boss_face();};
  93. void() boss_idle16    =[    $walk16, boss_idle17 ] {boss_face();};
  94. void() boss_idle17    =[    $walk17, boss_idle18 ] {boss_face();};
  95. void() boss_idle18    =[    $walk18, boss_idle19 ] {boss_face();};
  96. void() boss_idle19    =[    $walk19, boss_idle20 ] {boss_face();};
  97. void() boss_idle20    =[    $walk20, boss_idle21 ] {boss_face();};
  98. void() boss_idle21    =[    $walk21, boss_idle22 ] {boss_face();};
  99. void() boss_idle22    =[    $walk22, boss_idle23 ] {boss_face();};
  100. void() boss_idle23    =[    $walk23, boss_idle24 ] {boss_face();};
  101. void() boss_idle24    =[    $walk24, boss_idle25 ] {boss_face();};
  102. void() boss_idle25    =[    $walk25, boss_idle26 ] {boss_face();};
  103. void() boss_idle26    =[    $walk26, boss_idle27 ] {boss_face();};
  104. void() boss_idle27    =[    $walk27, boss_idle28 ] {boss_face();};
  105. void() boss_idle28    =[    $walk28, boss_idle29 ] {boss_face();};
  106. void() boss_idle29    =[    $walk29, boss_idle30 ] {boss_face();};
  107. void() boss_idle30    =[    $walk30, boss_idle31 ] {boss_face();};
  108. void() boss_idle31    =[    $walk31, boss_idle1 ] {boss_face();};
  109.  
  110. void() boss_missile1    =[    $attack1, boss_missile2 ] {boss_face();};
  111. void() boss_missile2    =[    $attack2, boss_missile3 ] {boss_face();};
  112. void() boss_missile3    =[    $attack3, boss_missile4 ] {boss_face();};
  113. void() boss_missile4    =[    $attack4, boss_missile5 ] {boss_face();};
  114. void() boss_missile5    =[    $attack5, boss_missile6 ] {boss_face();};
  115. void() boss_missile6    =[    $attack6, boss_missile7 ] {boss_face();};
  116. void() boss_missile7    =[    $attack7, boss_missile8 ] {boss_face();};
  117. void() boss_missile8    =[    $attack8, boss_missile9 ] {boss_face();};
  118. void() boss_missile9    =[    $attack9, boss_missile10 ] {boss_missile('100 100 200');};
  119. void() boss_missile10    =[    $attack10, boss_missile11 ] {boss_face();};
  120. void() boss_missile11    =[    $attack11, boss_missile12 ] {boss_face();};
  121. void() boss_missile12    =[    $attack12, boss_missile13 ] {boss_face();};
  122. void() boss_missile13    =[    $attack13, boss_missile14 ] {boss_face();};
  123. void() boss_missile14    =[    $attack14, boss_missile15 ] {boss_face();};
  124. void() boss_missile15    =[    $attack15, boss_missile16 ] {boss_face();};
  125. void() boss_missile16    =[    $attack16, boss_missile17 ] {boss_face();};
  126. void() boss_missile17    =[    $attack17, boss_missile18 ] {boss_face();};
  127. void() boss_missile18    =[    $attack18, boss_missile19 ] {boss_face();};
  128. void() boss_missile19    =[    $attack19, boss_missile20 ] {boss_face();};
  129. void() boss_missile20    =[    $attack20, boss_missile21 ] {boss_missile('100 -100 200');};
  130. void() boss_missile21    =[    $attack21, boss_missile22 ] {boss_face();};
  131. void() boss_missile22    =[    $attack22, boss_missile23 ] {boss_face();};
  132. void() boss_missile23    =[    $attack23, boss_missile1 ] {boss_face();};
  133.  
  134. void() boss_shocka1 =[    $shocka1, boss_shocka2 ] {};
  135. void() boss_shocka2 =[    $shocka2, boss_shocka3 ] {};
  136. void() boss_shocka3 =[    $shocka3, boss_shocka4 ] {};
  137. void() boss_shocka4 =[    $shocka4, boss_shocka5 ] {};
  138. void() boss_shocka5 =[    $shocka5, boss_shocka6 ] {};
  139. void() boss_shocka6 =[    $shocka6, boss_shocka7 ] {};
  140. void() boss_shocka7 =[    $shocka7, boss_shocka8 ] {};
  141. void() boss_shocka8 =[    $shocka8, boss_shocka9 ] {};
  142. void() boss_shocka9 =[    $shocka9, boss_shocka10 ] {};
  143. void() boss_shocka10 =[    $shocka10, boss_missile1 ] {};
  144.  
  145. void() boss_shockb1 =[    $shockb1, boss_shockb2 ] {};
  146. void() boss_shockb2 =[    $shockb2, boss_shockb3 ] {};
  147. void() boss_shockb3 =[    $shockb3, boss_shockb4 ] {};
  148. void() boss_shockb4 =[    $shockb4, boss_shockb5 ] {};
  149. void() boss_shockb5 =[    $shockb5, boss_shockb6 ] {};
  150. void() boss_shockb6 =[    $shockb6, boss_shockb7 ] {};
  151. void() boss_shockb7 =[    $shockb1, boss_shockb8 ] {};
  152. void() boss_shockb8 =[    $shockb2, boss_shockb9 ] {};
  153. void() boss_shockb9 =[    $shockb3, boss_shockb10 ] {};
  154. void() boss_shockb10 =[    $shockb4, boss_missile1 ] {};
  155.  
  156. void() boss_shockc1 =[    $shockc1, boss_shockc2 ] {};
  157. void() boss_shockc2 =[    $shockc2, boss_shockc3 ] {};
  158. void() boss_shockc3 =[    $shockc3, boss_shockc4 ] {};
  159. void() boss_shockc4 =[    $shockc4, boss_shockc5 ] {};
  160. void() boss_shockc5 =[    $shockc5, boss_shockc6 ] {};
  161. void() boss_shockc6 =[    $shockc6, boss_shockc7 ] {};
  162. void() boss_shockc7 =[    $shockc7, boss_shockc8 ] {};
  163. void() boss_shockc8 =[    $shockc8, boss_shockc9 ] {};
  164. void() boss_shockc9 =[    $shockc9, boss_shockc10 ] {};
  165. void() boss_shockc10 =[    $shockc10, boss_death1 ] {};
  166.  
  167. void() boss_death1 = [$death1, boss_death2] {
  168. sound (self, CHAN_VOICE, "boss1/death.wav", 1, ATTN_NORM);
  169. };
  170. void() boss_death2 = [$death2, boss_death3] {};
  171. void() boss_death3 = [$death3, boss_death4] {};
  172. void() boss_death4 = [$death4, boss_death5] {};
  173. void() boss_death5 = [$death5, boss_death6] {};
  174. void() boss_death6 = [$death6, boss_death7] {};
  175. void() boss_death7 = [$death7, boss_death8] {};
  176. void() boss_death8 = [$death8, boss_death9] {};
  177. void() boss_death9 = [$death9, boss_death10]
  178. {
  179.     sound (self, CHAN_BODY, "boss1/out1.wav", 1, ATTN_NORM);
  180.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  181.     WriteByte (MSG_BROADCAST, TE_LAVASPLASH);
  182.     WriteCoord (MSG_BROADCAST, self.origin_x);
  183.     WriteCoord (MSG_BROADCAST, self.origin_y);
  184.     WriteCoord (MSG_BROADCAST, self.origin_z);
  185. };
  186.  
  187. void() boss_death10 = [$death9, boss_death10]
  188. {
  189.     killed_monsters = killed_monsters + 1;
  190.     WriteByte (MSG_ALL, SVC_KILLEDMONSTER);    // FIXME: reliable broadcast
  191.     SUB_UseTargets ();
  192.     remove (self);
  193. };
  194.  
  195. void(vector p) boss_missile =
  196. {
  197.     local    vector    offang;
  198.     local    vector    org, vec, d;
  199.     local    float    t;
  200.  
  201.     offang = vectoangles (self.enemy.origin - self.origin);    
  202.     makevectors (offang);
  203.  
  204.     org = self.origin + p_x*v_forward + p_y*v_right + p_z*'0 0 1';
  205.     
  206. // lead the player on hard mode
  207.     if (skill > 1)
  208.     {
  209.         t = vlen(self.enemy.origin - org) / 300;
  210.         vec = self.enemy.velocity;
  211.         vec_z = 0;
  212.         d = self.enemy.origin + t * vec;        
  213.     }
  214.     else
  215.     {
  216.         d = self.enemy.origin;
  217.     }
  218.     
  219.     vec = normalize (d - org);
  220.  
  221.     launch_spike (org, vec);
  222.     setmodel (newmis, "progs/lavaball.mdl");
  223.     newmis.avelocity = '200 100 300';
  224.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);        
  225.     newmis.velocity = vec*300;
  226.     newmis.touch = T_MissileTouch; // rocket explosion
  227.     sound (self, CHAN_WEAPON, "boss1/throw.wav", 1, ATTN_NORM);
  228.  
  229. // check for dead enemy
  230.     if (self.enemy.health <= 0)
  231.         boss_idle1 ();
  232. };
  233.  
  234.  
  235. void() boss_awake =
  236. {
  237.     self.solid = SOLID_SLIDEBOX;
  238.     self.movetype = MOVETYPE_STEP;
  239.     self.takedamage = DAMAGE_NO;
  240.     
  241.     setmodel (self, "progs/boss.mdl");
  242.     setsize (self, '-128 -128 -24', '128 128 256');
  243.     
  244.     if (skill == 0)
  245.         self.health = 1;
  246.     else
  247.         self.health = 3;
  248.  
  249.     self.enemy = activator;
  250.  
  251.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  252.     WriteByte (MSG_BROADCAST, TE_LAVASPLASH);
  253.     WriteCoord (MSG_BROADCAST, self.origin_x);
  254.     WriteCoord (MSG_BROADCAST, self.origin_y);
  255.     WriteCoord (MSG_BROADCAST, self.origin_z);
  256.  
  257.     self.yaw_speed = 20;
  258.     boss_rise1 ();
  259. };
  260.  
  261.  
  262. /*QUAKED monster_boss (1 0 0) (-128 -128 -24) (128 128 256)
  263. */
  264. void() monster_boss =
  265. {
  266.     if (deathmatch)
  267.     {
  268.         remove(self);
  269.         return;
  270.     }
  271.     precache_model ("progs/boss.mdl");
  272.     precache_model ("progs/lavaball.mdl");
  273.  
  274.     precache_sound ("weapons/rocket1i.wav");
  275.     precache_sound ("boss1/out1.wav");
  276.     precache_sound ("boss1/sight1.wav");
  277.     precache_sound ("misc/power.wav");
  278.     precache_sound ("boss1/throw.wav");
  279.     precache_sound ("boss1/pain.wav");
  280.     precache_sound ("boss1/death.wav");
  281.  
  282.     total_monsters = total_monsters + 1;
  283.  
  284.     self.use = boss_awake;
  285. };
  286.  
  287. //===========================================================================
  288.  
  289. entity    le1, le2;
  290. float    lightning_end;
  291.  
  292. void() lightning_fire =
  293. {
  294.     local vector p1, p2;
  295.     
  296.     if (time >= lightning_end)
  297.     {    // done here, put the terminals back up
  298.         self = le1;
  299.         door_go_down ();
  300.         self = le2;
  301.         door_go_down ();
  302.         return;
  303.     }
  304.     
  305.     p1 = (le1.mins + le1.maxs) * 0.5;
  306.     p1_z = le1.absmin_z - 16;
  307.     
  308.     p2 = (le2.mins + le2.maxs) * 0.5;
  309.     p2_z = le2.absmin_z - 16;
  310.     
  311.     // compensate for length of bolt
  312.     p2 = p2 - normalize(p2-p1)*100;
  313.  
  314.     self.nextthink = time + 0.1;
  315.     self.think = lightning_fire;
  316.  
  317.     WriteByte (MSG_ALL, SVC_TEMPENTITY);
  318.     WriteByte (MSG_ALL, TE_LIGHTNING3);
  319.     WriteEntity (MSG_ALL, world);
  320.     WriteCoord (MSG_ALL, p1_x);
  321.     WriteCoord (MSG_ALL, p1_y);
  322.     WriteCoord (MSG_ALL, p1_z);
  323.     WriteCoord (MSG_ALL, p2_x);
  324.     WriteCoord (MSG_ALL, p2_y);
  325.     WriteCoord (MSG_ALL, p2_z);
  326. };
  327.  
  328. void() lightning_use =
  329. {
  330.     if (lightning_end >= time + 1)
  331.         return;
  332.  
  333.     le1 = find( world, target, "lightning");
  334.     le2 = find( le1, target, "lightning");
  335.     if (!le1 || !le2)
  336.     {
  337.         dprint ("missing lightning targets\n");
  338.         return;
  339.     }
  340.     
  341.     if (
  342.      (le1.state != STATE_TOP && le1.state != STATE_BOTTOM)
  343.     || (le2.state != STATE_TOP && le2.state != STATE_BOTTOM)
  344.     || (le1.state != le2.state) )
  345.     {
  346. //        dprint ("not aligned\n");
  347.         return;
  348.     }
  349.  
  350. // don't let the electrodes go back up until the bolt is done
  351.     le1.nextthink = -1;
  352.     le2.nextthink = -1;
  353.     lightning_end = time + 1;
  354.  
  355.     sound (self, CHAN_VOICE, "misc/power.wav", 1, ATTN_NORM);
  356.     lightning_fire ();        
  357.  
  358. // advance the boss pain if down
  359.     self = find (world, classname, "monster_boss");
  360.     if (!self)
  361.         return;
  362.     self.enemy = activator;
  363.     if (le1.state == STATE_TOP && self.health > 0)
  364.     {
  365.         sound (self, CHAN_VOICE, "boss1/pain.wav", 1, ATTN_NORM);
  366.         self.health = self.health - 1;
  367.         if (self.health >= 2)
  368.             boss_shocka1();
  369.         else if (self.health == 1)
  370.             boss_shockb1();
  371.         else if (self.health == 0)
  372.             boss_shockc1();
  373.     }    
  374. };
  375.  
  376.  
  377. /*QUAKED event_lightning (0 1 1) (-16 -16 -16) (16 16 16)
  378. Just for boss level.
  379. */
  380. void() event_lightning =
  381. {
  382.     self.use = lightning_use;
  383. };
  384.  
  385.  
  386.